//
//  RZChatSessionInputBarControl.h
//  RZIM
//
//  Created by reyzhang on 2021/8/4.
//  会话聊天底部工具条，发语音，文本，表情等

#import <UIKit/UIKit.h>
#import "RZInputContainerView.h"
#import "RZEmojiBoardView.h"
#import "RZPluginBoardView.h"



NS_ASSUME_NONNULL_BEGIN

//#define ChatSessionInputBar_Height 49.5f

/*!
 输入工具栏的输入模式
 */
typedef NS_ENUM(NSInteger, RZChatSessionInputBarInputType) {
    /*!
     文本输入模式
     */
    RCChatSessionInputBarInputText = 0,
    /*!
     语音输入模式
     */
    RCChatSessionInputBarInputVoice = 1,
    /*!
     扩展输入模式
     */
    RCChatSessionInputBarInputExtention = 2,
    /*!
     阅后即焚输入模式
     */
    RCChatSessionInputBarInputDestructMode = 3
};


#define PLUGIN_BOARD_ITEM_ALBUM_TAG 1001
#define PLUGIN_BOARD_ITEM_CAMERA_TAG 1002
#define PLUGIN_BOARD_ITEM_LOCATION_TAG 1003
#define PLUGIN_BOARD_ITEM_DESTRUCT_TAG 1004
#define PLUGIN_BOARD_ITEM_FILE_TAG 1006
#define PLUGIN_BOARD_ITEM_VOIP_TAG 1101
#define PLUGIN_BOARD_ITEM_VIDEO_VOIP_TAG 1102
#define PLUGIN_BOARD_ITEM_EVA_TAG 1103
#define PLUGIN_BOARD_ITEM_RED_PACKET_TAG 1104
#define PLUGIN_BOARD_ITEM_VOICE_INPUT_TAG 1105
#define PLUGIN_BOARD_ITEM_PTT_TAG 1106
#define PLUGIN_BOARD_ITEM_CARD_TAG 1107
#define PLUGIN_BOARD_ITEM_REMOTE_CONTROL_TAG 1108
#define PLUGIN_BOARD_ITEM_TRANSFER_TAG 1109


@protocol RZChatSessionInputBarControlDelegate;
@interface RZChatSessionInputBarControl : UIView

#pragma mark - 视图显示
/*!
 所处的会话页面View
 */
@property (weak, nonatomic, readonly) UIView *containerView;

/*!
 容器View
 */
@property (strong, nonatomic) RZInputContainerView *inputContainerView;

/*!
 表情View
 */
@property (nonatomic, strong) RZEmojiBoardView *emojiBoardView;


/*!
 输入扩展功能板View
 */
@property (nonatomic, strong) RZPluginBoardView *pluginBoardView;





/*!
 语音与文本输入切换的按钮
 */
@property (strong, nonatomic) UIButton *switchButton;

/*!
 录制语音消息的按钮
 */
@property (strong, nonatomic) UIButton *recordButton;

/*!
 文本输入框
 */
@property (strong, nonatomic) UITextView *inputTextView;

/*!
 表情的按钮
 */
@property (strong, nonatomic) UIButton *emojiButton;

/*!
 扩展输入的按钮
 */
@property (strong, nonatomic) UIButton *additionalButton;

#pragma mark - 代理监听
/*!
 输入工具栏的点击回调监听
 */
@property (weak, nonatomic) id<RZChatSessionInputBarControlDelegate> delegate;

#pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame
            withContainerView:(UIView *)containerView
             defaultInputType:(RZChatSessionInputBarInputType)defaultInputType;



#pragma mark Life Cycle
/*!
 View即将显示的回调
 */
- (void)containerViewWillAppear;

/*!
 View已经显示的回调
 */
- (void)containerViewDidAppear;

/*!
 View即将隐藏的回调
 */
- (void)containerViewWillDisappear;


#pragma mark 状态控制
/*!
 重置到默认状态
 */
- (void)resetToDefaultStatus;

/*!
 内容区域大小发生变化。

 @discussion 当本view所在的view frame发生变化，需要重新计算本view的frame时，调用此方法
 */
- (void)containerViewSizeChanged;

/**
 内容区域大小发生变化。

 @discussion 当本view所在的view frame发生变化，需要重新计算本view的frame时，调用此方法，无动画
 */
- (void)containerViewSizeChangedNoAnnimation;

/*!
 设置默认的输入框类型

 @param defaultInputType  默认输入框类型
 */
- (void)setDefaultInputType:(RZChatSessionInputBarInputType)defaultInputType;


#pragma mark Public method
/*!
 打开系统相册，选择图片

 @discussion 选择结果通过delegate返回
 */
- (void)openSystemAlbum;

/*!
 打开系统相机，拍摄图片

 @discussion 拍摄结果通过delegate返回
 */
- (void)openSystemCamera;

/*!
 撤销录音
 */
- (void)cancelVoiceRecord;

/*!
 结束录音
 */
- (void)endVoiceRecord;
#pragma mark - 设置
/*!
 当前的输入状态
 */
@property (nonatomic,assign) KBottomBarStatus currentBottomBarStatus;



@end




/*!
 输入工具栏的点击监听器
 */
@protocol RZChatSessionInputBarControlDelegate <NSObject>

/*!
 显示ViewController

 @param viewController 需要显示的ViewController
 @param functionTag    功能标识
 */
- (void)presentViewController:(UIViewController *)viewController functionTag:(NSInteger)functionTag;

@optional



#pragma mark - ChatInput
/*!
 输入工具栏尺寸（高度）发生变化的回调

 @param chatInputBar 输入工具栏
 @param frame        输入工具栏最终需要显示的Frame
 */
- (void)chatInputBar:(RZChatSessionInputBarControl *)chatInputBar shouldChangeFrame:(CGRect)frame;

/*!
 点击键盘Return按钮的回调

 @param inputTextView 文本输入框
 */
- (void)inputTextViewDidTouchSendKey:(UITextView *)inputTextView;


/*!
 输入框中内容发生变化的回调

 @param inputTextView 文本输入框
 @param range         当前操作的范围
 @param text          插入的文本
 */
- (void)inputTextView:(UITextView *)inputTextView
    shouldChangeTextInRange:(NSRange)range
            replacementText:(NSString *)text;




#pragma mark - 表情键盘
/*!
 点击表情的回调

 @param emojiView    表情输入的View
 @param touchedEmoji 点击的表情对应的字符串编码
 */
- (void)emojiView:(RZEmojiBoardView *)emojiView didTouchedEmoji:(NSString *)touchedEmoji;

/*!
 点击发送按钮的回调

 @param emojiView  表情输入的View
 @param sendButton 发送按钮
 */
- (void)emojiView:(RZEmojiBoardView *)emojiView didTouchSendButton:(UIButton *)sendButton;



#pragma mark - 插件面板
/*!
 点击扩展功能板中的扩展项的回调

 @param pluginBoardView 当前扩展功能板
 @param tag             点击的扩展项的唯一标示符
 */
- (void)pluginBoardView:(RZPluginBoardView *)pluginBoardView clickedItemWithTag:(NSInteger)tag;

/*!
  相机拍照图片

 @param image   相机拍摄，选择发送的图片
 */
- (void)imageDidCapture:(UIImage *)image;

/**
 相机录制小视频完成后调用

 @param url 小视频url
 @param image 小视频首帧图片
 @param duration 小视频时长 单位秒
 */
- (void)sightDidFinishRecord:(NSString *)url thumbnail:(UIImage *)image duration:(NSUInteger)duration;



/*!
 相册选择图片列表,返回图片的 NSData

 @param selectedImages   选中的图片
 @param full             用户是否要求原图
 */
- (void)imageDataDidSelect:(NSArray *)selectedImages fullImageRequired:(BOOL)full;

/*!
 选择文件列表

 @param filePathList   被选中的文件路径list
 */
- (void)fileDidSelect:(NSArray *)filePathList;

/**
 会话页面发送文件消息，在文件选择页面选择某个文件时调用该方法方法

 @param path 文件路径
 @return 返回 YES 允许文件被选中，否则不允许选中
 @discussion 该方法默认返回YES，这个方法可以控制某些文件是否可以被选中。
 */
- (BOOL)canBeSelectedAtFilePath:(NSString *)path;

/*!
 输入工具栏状态变化时的回调（暂未实现）

 @param bottomBarStatus 当前状态
 */
- (void)chatSessionInputBarStatusChanged:(KBottomBarStatus)bottomBarStatus;

#pragma mark - 录制语音消息
/*!
 即将开始录制语音消息
 返回 YES：继续录音
 返回 NO：停止录音（音频配占用时，可以处理弹窗等）
 */
- (BOOL)recordWillBegin;

/*!
 开始录制语音消息
 */
- (void)recordDidBegin;

/*!
 取消录制语音消息
 */
- (void)recordDidCancel;

/*!
 结束录制语音消息
 */
- (void)recordDidEnd:(NSData *)recordData
          recordFile:(NSURL *)recordFile
            duration:(long)duration
               error:(NSError *)error;




@end

NS_ASSUME_NONNULL_END
